JavaScript Temporal API bo'yicha chuqur qo'llanma – turli xalqaro kontekstlarda sana va vaqtlarni samarali boshqarish uchun zamonaviy yechim.
JavaScript Temporal API: Global Auditoriya Uchun Sana va Vaqtni Zamonaviy Boshqarish
JavaScript `Date` obyekti uzoq vaqtdan beri dasturchilar uchun noqulaylik manbai bo'lib kelgan. Uning o'zgaruvchanligi, nomuvofiq API va vaqt mintaqasini yomon qo'llab-quvvatlashi Moment.js va date-fns kabi ko'plab kutubxonalarning paydo bo'lishiga olib keldi. Endi, Temporal API bilan JavaScript sana va vaqtlarni yaxshilangan aniqlik va tiniqlik bilan boshqarish uchun zamonaviy, o'rnatilgan yechimni taklif qiladi. Ushbu maqolada Temporal API ning xususiyatlari, afzalliklari va turli xalqaro kontekstlarda qo'llanilishiga e'tibor qaratilgan holda keng qamrovli tahlil taqdim etiladi.
Temporal API nima?
Temporal API — bu JavaScript-dagi `Date` obyektining kamchiliklarini bartaraf etish uchun mo'ljallangan yangi, global obyekt. U sanalar, vaqtlar, vaqt mintaqalari va taqvim tizimlari bilan ishlash uchun toza, o'zgarmas API taqdim etadi. Eng muhimi, u sana va vaqt tushunchalarini real dunyodagi foydalanish va kutishlarga yaqinroq tarzda ifodalashni maqsad qiladi, bu esa internatsionallashtirishni ancha soddalashtiradi.
Asosiy xususiyatlari:
- O'zgarmaslik: Temporal obyektlari o'zgarmasdir, ya'ni kun yoki oylarni qo'shish kabi amallar asl nusxani o'zgartirish o'rniga yangi obyektlarni qaytaradi. Bu xatolarning keng tarqalgan manbasini yo'q qiladi va kodni tushunishni osonlashtiradi.
- Aniq API: Temporal sana va vaqt bilan bog'liq keng tarqalgan operatsiyalar uchun izchil va intuitiv API taqdim etadi.
- Vaqt Mintaqasini Qo'llab-quvvatlash: Temporal vaqt mintaqalarini mustahkam qo'llab-quvvatlaydi, bu sizga eski `Date` obyektining murakkabliklarisiz turli joylarda sana va vaqtlar bilan ishlash imkonini beradi. U IANA vaqt mintaqalari ma'lumotlar bazasidan foydalanadi, bu esa aniq va dolzarb ma'lumotlarni ta'minlaydi.
- Taqvim Tizimlari: Grigorian taqvimidan tashqari, Temporal turli madaniyatlar va mintaqalar ehtiyojlarini qondiradigan muqobil taqvim tizimlarini qo'llab-quvvatlaydi.
- Yaxshilangan Aniq: Temporal nanosoniyagacha aniqlikni taklif etadi, bu esa millisoniyaga asoslangan `Date` obyektining cheklovlarini bartaraf etadi.
Asosiy Temporal Obyektlari
Temporal API bir nechta yangi obyekt turlarini taqdim etadi. Mana ularning ba'zi asosiy turlari:
- `Temporal.PlainDate`: Vaqt mintaqasisiz sanani (yil, oy, kun) ifodalaydi.
- `Temporal.PlainTime`: Sana yoki vaqt mintaqasisiz vaqtni (soat, daqiqa, soniya, millisoniya, mikrosoniya, nanosoniya) ifodalaydi.
- `Temporal.PlainDateTime`: Vaqt mintaqasisiz sana va vaqtni ifodalaydi.
- `Temporal.ZonedDateTime`: Muayyan vaqt mintaqasi bilan sana va vaqtni ifodalaydi.
- `Temporal.Instant`: Vaqtning aniq bir lahzasini ifodalaydi, Unix davridan (1970 yil 1 yanvar, UTC) boshlab nanosoniyalarda o'lchanadi.
- `Temporal.TimeZone`: Vaqt mintaqasini ifodalaydi.
- `Temporal.Duration`: Vaqt oralig'ini ifodalaydi (masalan, 2 soat, 30 daqiqa).
- `Temporal.YearMonth`: Yil va oyni ifodalaydi.
- `Temporal.MonthDay`: Oy va kunni ifodalaydi.
Sanalar bilan ishlash
`Temporal.PlainDate` yaratish
`Temporal.PlainDate` yaratish uchun konstruktordan foydalanishingiz mumkin:
const plainDate = new Temporal.PlainDate(2024, 10, 27); // Yil, Oy (1-12), Kun
console.log(plainDate.toString()); // Natija: 2024-10-27
Shuningdek, ISO 8601 formatidagi satrni qabul qiluvchi `from` metodidan ham foydalanishingiz mumkin:
const plainDateFromString = Temporal.PlainDate.from('2024-10-27');
console.log(plainDateFromString.toString()); // Natija: 2024-10-27
Sana Komponentlarini Olish
Siz `year`, `month` va `day` kabi xususiyatlar yordamida alohida sana komponentlariga kirishingiz mumkin:
console.log(plainDate.year); // Natija: 2024
console.log(plainDate.month); // Natija: 10
console.log(plainDate.day); // Natija: 27
Sana Arifmetikasi
Kunlar, haftalar, oylar yoki yillarni qo'shish yoki ayirish uchun `plus` va `minus` metodlaridan foydalaning. Bu metodlar yangi `Temporal.PlainDate` obyektini qaytaradi:
const nextWeek = plainDate.plus({ days: 7 });
console.log(nextWeek.toString()); // Natija: 2024-11-03
const lastMonth = plainDate.minus({ months: 1 });
console.log(lastMonth.toString()); // Natija: 2024-09-27
Sanalarni Taqqoslash
Siz `compare` metodi yordamida sanalarni taqqoslashingiz mumkin:
const date1 = new Temporal.PlainDate(2024, 10, 27);
const date2 = new Temporal.PlainDate(2024, 11, 15);
console.log(Temporal.PlainDate.compare(date1, date2)); // Natija: -1 (date1 date2 dan oldinroq)
Vaqtlar bilan ishlash
`Temporal.PlainTime` yaratish
`Temporal.PlainTime` yaratish uchun konstruktordan foydalaning:
const plainTime = new Temporal.PlainTime(10, 30, 0); // Soat, Daqiqa, Soniya
console.log(plainTime.toString()); // Natija: 10:30:00
Yoki ISO 8601 vaqt satri bilan `from` metodidan foydalaning:
const plainTimeFromString = Temporal.PlainTime.from('10:30:00');
console.log(plainTimeFromString.toString()); // Natija: 10:30:00
Vaqt Komponentlarini Olish
console.log(plainTime.hour); // Natija: 10
console.log(plainTime.minute); // Natija: 30
console.log(plainTime.second); // Natija: 0
Vaqt Arifmetikasi
const later = plainTime.plus({ minutes: 15 });
console.log(later.toString()); // Natija: 10:45:00
Sana va Vaqt bilan Birgalikda Ishlash
`Temporal.PlainDateTime` yaratish
Siz `Temporal.PlainDateTime` ni to'g'ridan-to'g'ri yoki `Temporal.PlainDate` va `Temporal.PlainTime` ni birlashtirib yaratishingiz mumkin:
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
console.log(plainDateTime.toString()); // Natija: 2024-10-27T10:30:00
const date = new Temporal.PlainDate(2024, 10, 27);
const time = new Temporal.PlainTime(10, 30, 0);
const combinedDateTime = date.toPlainDateTime(time);
console.log(combinedDateTime.toString()); // Natija: 2024-10-27T10:30:00
Vaqt Mintaqalari
Vaqt mintaqalarini to'g'ri boshqarish turli joylardagi foydalanuvchilar bilan ishlaydigan ilovalar uchun juda muhimdir. Temporal API `Temporal.ZonedDateTime` va `Temporal.TimeZone` obyektlari orqali vaqt mintaqalarini mustahkam qo'llab-quvvatlaydi.
`Temporal.ZonedDateTime` yaratish
`Temporal.ZonedDateTime` yaratish uchun sizga `Temporal.PlainDateTime` va vaqt mintaqasi identifikatori kerak bo'ladi. Vaqt mintaqasi identifikatorlari IANA vaqt mintaqalari ma'lumotlar bazasiga asoslangan (masalan, `America/Los_Angeles`, `Europe/London`, `Asia/Tokyo`).
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
console.log(zonedDateTime.toString()); // Natija: 2024-10-27T10:30:00-07:00[America/Los_Angeles] (Siljish yozgi vaqt qoidalariga bog'liq bo'ladi)
Shu bilan bir qatorda, `Instant` dan `Temporal.ZonedDateTime` yarating.
const instant = Temporal.Instant.fromEpochSeconds(1666866600); // Misol vaqt belgisi
const zonedDateTimeFromInstant = instant.toZonedDateTimeISO(timeZone); // 'America/Los_Angeles' kabi vaqt mintaqasi
console.log(zonedDateTimeFromInstant.toString());
Vaqt Mintaqalari O'rtasida Konvertatsiya Qilish
Siz `Temporal.ZonedDateTime` ni `withTimeZone` metodi yordamida boshqa vaqt mintaqasiga o'zgartirishingiz mumkin:
const newTimeZone = 'Europe/London';
const zonedDateTimeInLondon = zonedDateTime.withTimeZone(newTimeZone);
console.log(zonedDateTimeInLondon.toString()); // Natija: 2024-10-27T18:30:00+01:00[Europe/London]
Vaqt Mintaqasi Siljishlari bilan Ishlash
`Temporal.TimeZone` obyektining `getOffsetStringFor` metodi berilgan `Temporal.Instant` uchun siljish satrini taqdim etadi:
const timeZoneObject = new Temporal.TimeZone(timeZone);
const offsetString = timeZoneObject.getOffsetStringFor(zonedDateTime.toInstant());
console.log(offsetString); // Natija: -07:00 (Yozgi vaqt qoidalariga bog'liq)
Aniq hisob-kitoblar uchun to'g'ri IANA vaqt mintaqasi identifikatorlaridan foydalanish muhimdir. Ushbu identifikatorlar yozgi vaqtga o'tish va vaqt mintaqalari chegaralaridagi o'zgarishlarni aks ettirish uchun muntazam ravishda saqlanadi va yangilanadi.
Davomiyliklar
`Temporal.Duration` obyekti vaqt oralig'ini ifodalaydi. Uni sana va vaqtlarga qo'shish yoki ulardan ayirish uchun ishlatish mumkin.
`Temporal.Duration` yaratish
Siz `Temporal.Duration` ni konstruktor yordamida, yillar, oylar, kunlar, soatlar, daqiqalar, soniyalar, millisoniyalar, mikrosoniyalar va nanosoniyalarni ko'rsatib yaratishingiz mumkin:
const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9); // Yillar, Oylar, Kunlar, Soatlar, Daqiqalar, Soniyalar, Millisoniyalar, Mikrosoniyalar, Nanosoniyalar
console.log(duration.toString()); // Natija: P1Y2M3DT4H5M6.007008009S
Yoki ISO 8601 davomiylik satridan foydalanib:
const durationFromString = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(durationFromString.toString()); // Natija: P1Y2M3DT4H5M6S
Davomiyliklarni Sana va Vaqtlarga Qo'shish
const plainDate = new Temporal.PlainDate(2024, 10, 27);
const duration = new Temporal.Duration(0, 0, 7); // 7 kun
const newDate = plainDate.plus(duration);
console.log(newDate.toString()); // Natija: 2024-11-03
E'tibor bering, oylar yoki yillarni o'z ichiga olgan davomiyliklarni sanalarga qo'shishda ehtiyotkorlik bilan yondashish kerak, chunki bir oydagi yoki yildagi kunlar soni o'zgarishi mumkin.
Taqvim Tizimlari
Temporal API Grigorian taqvimidan tashqari turli taqvim tizimlarini qo'llab-quvvatlaydi. Bu turli madaniy kontekstlarda sanalarni boshqarishi kerak bo'lgan ilovalar uchun juda muhimdir. Qo'llab-quvvatlash hali rivojlanayotgan bo'lsa-da, u kelajakdagi kengayish uchun asos yaratadi.
Alternativ Taqvimlaridan Foydalanish
Muayyan taqvimdan foydalanish uchun uni Temporal obyektlarini yaratishda ko'rsatishingiz mumkin:
const hebrewDate = new Temporal.PlainDate(5785, 1, 1, { calendar: 'hebrew' });
console.log(hebrewDate.toString()); // Aniq natija amalga oshirish va formatlashga qarab farq qilishi mumkin. Yozish vaqtida ko'plab muhitlarda polifil talab qiladi.
Muhim: Grigorian bo'lmagan taqvimlarni qo'llab-quvvatlash polifillar yoki maxsus brauzer/muhit qo'llab-quvvatlashini talab qilishi mumkin. Eng so'nggi ma'lumotlar uchun Temporal API hujjatlari va brauzer mosligi jadvallarini tekshiring.
Sana va Vaqtlarni Formatlash
Temporal API sana va vaqtni manipulyatsiya qilishga qaratilgan bo'lsa-da, formatlash odatda `Intl.DateTimeFormat` obyekti tomonidan amalga oshiriladi, bu Xalqarolashtirish API ning bir qismidir. Temporal obyektlari `Intl.DateTimeFormat` bilan muammosiz ishlaydi.
`Intl.DateTimeFormat` dan Foydalanish
Mana `Temporal.PlainDate` ni `Intl.DateTimeFormat` yordamida qanday formatlash mumkin:
const plainDate = new Temporal.PlainDate(2024, 10, 27);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatter.format(plainDate)); // Natija: October 27, 2024
const formatterGerman = new Intl.DateTimeFormat('de-DE', { year: 'numeric', month: 'long', day: 'numeric' });
console.log(formatterGerman.format(plainDate)); // Natija: 27. Oktober 2024
Siz o'z ehtiyojlaringizga mos ravishda formatlash parametrlarini sozlashingiz mumkin. `Intl.DateTimeFormat` ning birinchi argumenti — bu lokal, u formatlash uchun ishlatiladigan til va mintaqaviy an'analarni belgilaydi. Turli lokallardan (masalan, 'en-US', 'de-DE', 'fr-FR', 'ja-JP') foydalanish turli xil natija formatlarini beradi.
`Temporal.ZonedDateTime` ni Formatlash
`Temporal.ZonedDateTime` ni formatlash ham shunga o'xshash, ammo siz natijaga vaqt mintaqasi ma'lumotlarini ham kiritishingiz mumkin:
const plainDateTime = new Temporal.PlainDateTime(2024, 10, 27, 10, 30, 0);
const timeZone = 'America/Los_Angeles';
const zonedDateTime = plainDateTime.toZonedDateTime(timeZone);
const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', timeZoneName: 'short' });
console.log(formatter.format(zonedDateTime)); // Natija: October 27, 2024, 10:30 AM PDT (Vaqt mintaqasi qisqartmasi yozgi vaqt qoidalariga bog'liq)
Internatsionallashtirish bo'yicha Eng Yaxshi Amaliyotlar
Global kontekstda sana va vaqtlar bilan ishlashda quyidagi eng yaxshi amaliyotlarni yodda tuting:
- IANA Vaqt Mintaqasi Identifikatorlaridan Foydalaning: Vaqt mintaqasini aniq boshqarish uchun har doim IANA vaqt mintaqasi identifikatorlaridan (masalan, `America/Los_Angeles`, `Europe/London`) foydalaning.
- Yozgi Vaqtga O'tishdan Xabardor Bo'ling: Yozgi vaqtga o'tish (DST) vaqt mintaqasi siljishlariga ta'sir qilishi mumkin. Temporal API DST o'tishlarini avtomatik ravishda boshqaradi.
- Formatlash uchun `Intl.DateTimeFormat` dan foydalaning: Sana va vaqtlarni foydalanuvchining lokaliga muvofiq formatlash uchun `Intl.DateTimeFormat` obyektidan foydalaning.
- Taqvim Tizimlarini Hisobga Oling: Agar ilovangiz turli madaniy kontekstlardagi foydalanuvchilarni qo'llab-quvvatlashi kerak bo'lsa, muqobil taqvim tizimlaridan foydalanishni o'ylab ko'ring.
- Sana va Vaqtlarni UTC da Saqlang: Sana va vaqtlarni ma'lumotlar bazasida saqlashda, vaqt mintaqasi muammolarini oldini olish uchun ularni UTC (Muvofiqlashtirilgan Umumjahon Vaqti) da saqlash eng yaxshi amaliyotdir. Keyin, ko'rsatish uchun mahalliy vaqtga o'tkazing. Temporal UTC ga va UTC dan o'tkazish uchun metodlarni taqdim etadi.
- Puxta Sinovdan O'tkazing: Barcha foydalanuvchilar uchun to'g'ri ishlashini ta'minlash uchun ilovangizni turli vaqt mintaqalari, lokallar va taqvim tizimlari bilan sinab ko'ring.
Temporal API ni Eski Date Obyekti bilan Taqqoslash
Bu yerda Temporal API ning eski `Date` obyektiga nisbatan asosiy farqlari va afzalliklarini ko'rsatuvchi jadval keltirilgan:
Xususiyat | Eski `Date` Obyekti | Temporal API |
---|---|---|
O'zgaruvchanlik | O'zgaruvchan (asl obyektni o'zgartiradi) | O'zgarmas (yangi obyektlarni qaytaradi) |
Vaqt Mintaqasini Qo'llab-quvvatlash | Cheklangan va ko'pincha muammoli | Mustahkam va aniq, IANA vaqt mintaqalari ma'lumotlar bazasiga asoslangan |
API | Nomuvofiq va ishlatish qiyin | Aniq, izchil va intuitiv |
Aniq | Millisoniya | Nanosoniya |
Taqvim Tizimlari | Grigorian bilan cheklangan | Alternativ taqvim tizimlarini qo'llab-quvvatlaydi (rivojlanayotgan qo'llab-quvvatlash bilan) |
Internatsionallashtirish | Mustahkam internatsionallashtirish uchun tashqi kutubxonalarni talab qiladi | O'rnatilgan qo'llab-quvvatlash va `Intl.DateTimeFormat` bilan muammosiz integratsiya |
Brauzer tomonidan qo'llab-quvvatlanishi va Polifillar
Nisbatan yangi API bo'lganligi sababli, Temporal API ni brauzerlar tomonidan qo'llab-quvvatlanishi hali rivojlanmoqda. Qaysi brauzerlar va muhitlar uni tabiiy ravishda qo'llab-quvvatlashini ko'rish uchun eng so'nggi brauzer mosligi jadvallarini (masalan, MDN Web Docs da) tekshiring. Tabiiy qo'llab-quvvatlashga ega bo'lmagan eski brauzerlar yoki muhitlar uchun Temporal API funksionalligini ta'minlash uchun polifillardan foydalanishingiz mumkin. Mos variantlarni topish uchun internetda "Temporal API polyfill" deb qidiring.
Xulosa
JavaScript Temporal API JavaScript-da sana va vaqtlarni boshqarishda muhim qadamni ifodalaydi. Uning o'zgarmasligi, aniq API, mustahkam vaqt mintaqasini qo'llab-quvvatlashi va taqvim tizimi imkoniyatlari uni turli xalqaro kontekstlarda sana va vaqtlar bilan aniq va ishonchli ishlashi kerak bo'lgan ilovalar yaratuvchi dasturchilar uchun kuchli vositaga aylantiradi. Brauzer tomonidan qo'llab-quvvatlanish hali rivojlanayotgan bo'lsa-da, Temporal API ning afzalliklari uni o'rganishga va yangi loyihalar uchun qabul qilishga arziydi. Temporal API ni o'zlashtirib va internatsionallashtirish bo'yicha eng yaxshi amaliyotlarga rioya qilib, siz butun dunyodagi foydalanuvchilar uchun muammosiz va aniq sana va vaqt tajribasini taqdim etadigan ilovalar yaratishingiz mumkin.